/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.aruoc.sim.siguelineas;

import org.aruoc.sim.SimContacto;
import org.aruoc.sim.Sim;
import org.aruoc.sim.SimWorldPainter;
import java.awt.Graphics2D;
import net.phys2d.raw.FixedJoint;
import net.phys2d.raw.Joint;
import net.phys2d.raw.shapes.Box;
import net.phys2d.raw.shapes.Circle;

/**
 *
 * @mperezma
 */
public abstract class Siguelineas extends Sim {

    public float potencia = 20000.0f;
    private float rozamiento = 2.5f;
    protected SimContacto ruedaIzquierda;
    protected SimContacto ruedaDerecha;
    protected LineSensor sensorIzquierdo;
    protected LineSensor sensorDerecho;
    private int disntanciaX;
    private int disntanciaY;

    public Siguelineas() {
        super();
    }

    @Override
    public void construct() {

        ruedaIzquierda = new SimContacto(new Circle(5), 150, getRozamiento());
        ruedaIzquierda.setPosition(500, 100);
        getWorld().add(ruedaIzquierda);

        ruedaDerecha = new SimContacto(new Circle(5), 150, getRozamiento());
        ruedaDerecha.setPosition(550, 100);
        getWorld().add(ruedaDerecha);

        sensorDerecho = new LineSensor(new Box(1, 1), 0.01f);
        sensorDerecho.setPosition(ruedaDerecha.getPosition().getX() - getDisntanciaX(), ruedaDerecha.getPosition().getY() + getDisntanciaY());
        getWorld().add(sensorDerecho);

        sensorIzquierdo = new LineSensor(new Box(1, 1), 0.01f);
        sensorIzquierdo.setPosition(ruedaIzquierda.getPosition().getX() + getDisntanciaX(), ruedaIzquierda.getPosition().getY() + getDisntanciaY());
        getWorld().add(sensorIzquierdo);

        Joint union1 = new FixedJoint(ruedaIzquierda, ruedaDerecha);//ruedaDerecha);
        union1.setRelaxation(0f);
        getWorld().add(union1);

        Joint union2 = new FixedJoint(ruedaDerecha, sensorDerecho);//cuerpo);        
        union2.setRelaxation(0f);
        getWorld().add(union2);

        Joint union3 = new FixedJoint(sensorDerecho, sensorIzquierdo);//cuerpo);        
        union3.setRelaxation(0f);
        getWorld().add(union3);

        Joint union4 = new FixedJoint(sensorIzquierdo, ruedaIzquierda);//cuerpo);        
        union4.setRelaxation(0f);
        getWorld().add(union4);

    }

    @Override
    public void paint(SimWorldPainter p, Graphics2D g) {
        if (!p.dibujarEstela) {
            sensorIzquierdo.paint(p, g);
            sensorDerecho.paint(p, g);
        }
        ruedaIzquierda.paint(p, g);
        ruedaDerecha.paint(p, g);
    }

    @Override
    public void step() {
        // Impulsar ambas ruedas
        if (getWorld().upPressed) {
            activarMotorIzquierdo(potencia);
            activarMotorDerecho(potencia);
        }

        // Impulsar rueda izquierda
        if (getWorld().leftPressed) {
            activarMotorIzquierdo(potencia);
        }

        // Impulsar rueda derecha
        if (getWorld().rightPressed) {
            activarMotorDerecho(potencia);
        }

    }

    public void activarMotorDerecho(float potencia) {
        getWorld().impulsar(ruedaDerecha, potencia);

    }

    public void activarMotorIzquierdo(float potencia) {
        getWorld().impulsar(ruedaIzquierda, potencia);
    }

    public int getDisntanciaX() {
        return disntanciaX;
    }

    public void setDisntanciaX(int disntanciaX) {
        this.disntanciaX = disntanciaX;
    }

    public int getDisntanciaY() {
        return disntanciaY;
    }

    public void setDisntanciaY(int disntanciaY) {
        this.disntanciaY = disntanciaY;
    }

    public float getRozamiento() {
        return rozamiento;
    }

    public void setRozamiento(float rozamiento) {
        this.rozamiento = rozamiento;
    }
}
